package xin.marcher.module.inventory.service;

import xin.marcher.module.common.core.JsonResult;
import xin.marcher.module.inventory.domain.bo.BucketCapacity;
import xin.marcher.module.inventory.domain.bo.InventoryBucketOperateBO;
import xin.marcher.module.inventory.domain.request.*;
import xin.marcher.module.inventory.domain.response.ProductInventoryDTO;

/**
 * 库存分配接口
 *
 *
 */
public interface InventoryBucketService {

    /**
     * 商品库存入桶分配接口
     *
     * @param request
     */
    void inventorBucket(InventorBucketRequest request);

    /**
     * 分桶扩容接口
     *
     * @param bucketCapacity
     */
    void bucketCapacity(BucketCapacity bucketCapacity);

    /**
     * 分桶上线 + 扩容 接口
     *
     * @param request
     */
    void bucketOnline(InventorOnlineRequest request);

    /**
     * 分桶下线 + 缩容 接口
     *
     * @param request
     */
    void bucketOffline(InventorOfflineRequest request);

    /**
     * 查询某个卖家的商品相关库存分桶信息
     *
     * @param request
     * @return
     */
    ProductInventoryDTO queryProductInventoryList(InventoryRequest request);

    /**
     * 清空分桶库存，分桶库存放回中央库存
     *
     * @param bucketClearRequest
     */
    void bucketClear(BucketClearRequest bucketClearRequest);

    /**
     * 执行分桶相关操作
     *
     * @return
     */
    JsonResult processBucketOperate();

    /**
     * 清除分桶操作执行成功的任务
     *
     * @return
     */
    JsonResult bucketOperateFinishedClear();

    /**
     * 将初始化数据写入远程缓存以及本地缓存
     *
     * @param inventoryBucketOperateBO
     */
    void processInitBucket(InventoryBucketOperateBO inventoryBucketOperateBO);

    /**
     * 分桶上线数据写入缓存
     *
     * @param inventoryBucketOperateBO
     */
    void processOnlineOperate(InventoryBucketOperateBO inventoryBucketOperateBO);

    /**
     * 处理扩容任务
     *
     * @param inventoryBucketOperateBO
     */
    void processCapacityOperate(InventoryBucketOperateBO inventoryBucketOperateBO);

    /**
     * 处理下线任务
     *
     * @param inventoryBucketOperateBO
     */
    void processOfflineOperate(InventoryBucketOperateBO inventoryBucketOperateBO);

    /**
     * 清除执行完的分桶操作任务
     *
     * @param operate
     */
    void clearBucketOperate(InventoryBucketOperateBO operate);

    /**
     * 计算分桶某个时间区间的库存具体消费速度，生成预估的下线阈值
     */
    void calculateOfflineThreshold();
}
